home *** CD-ROM | disk | FTP | other *** search
/ By Popular Request 2.0 / By Popular Request 2.0 (Arsenal Computer).ISO / amiga_5 / rxmoon.lha / Rexx / Moon.rexx
OS/2 REXX Batch file  |  1995-04-30  |  4KB  |  153 lines

  1. /****** Moon.rexx *************************************************************
  2. *
  3. *    $VER: Moon 2.0 (30.4.95)
  4. *
  5. *******************************************************************************
  6. *
  7. *  Originially by Greg Cunningham 1990
  8. *  Rewritten by kas@mink.ping.dk (Klaus Alexander Seistrup) 1995
  9. *
  10. *  Converted from Unix TODAY.C
  11. *
  12. *    GMT settings (America):
  13. *
  14. *        Eastern    5
  15. *        Central    6
  16. *        Mountain    7
  17. *        Pacific    8
  18. *
  19. *        Denmark    1
  20. *
  21. ******************************************************************************/
  22.  
  23. TimeZone             = 1    /* Central European Time */
  24. DaylightSavings     = 1    /* Set to 1 if daylight savings time */
  25.  
  26. rmLib = 'rexxmathlib.library'
  27.  
  28. IF ~SHOW(L,rmLib) THEN CALL ADDLIB(rmLib,0,-30,0)
  29.  
  30. SAY Lunar(DATE('S'),TIME(),TimeZone-DaylightSavings)
  31.  
  32. EXIT 0
  33.  
  34. /*
  35. **    Phase of the Moon. Calculates the current phase of the moon.
  36. **    Based on routines from `Practical Astronomy with Your Calculator',
  37. **    by Duffett-Smith.
  38. **
  39. **    SYNOPSIS:
  40. **
  41. **        string = Lunar(year,time,gmt)
  42. **        date    --    Current sorted date
  43. **        time    --    Current time of the day
  44. **        gmt    --    Hours from GMT time zone (subtract one if daylight savings)
  45. **
  46. **    say Lunar(DATE('S'),TIME(),0)            Current phase of the moon
  47. **    say Lunar(DATE('S')+1,TIME(),0)        Same time tommorow
  48. **    say Lunar('19900225','12:00:00',0)    Feb 25, 1990 at noon
  49. */
  50. Lunar: PROCEDURE
  51.     ARG cdate,ctime,GMToffset
  52.     /*
  53.     **    Days between 01-Jan-1985 and now
  54.     */
  55.     numDays = DATE('B',cdate,'S') - DATE('B','19850101','S') + 1
  56.     /*
  57.     **    Add fraction of day
  58.     */
  59.     PARSE VAR ctime hour':'min':'sec
  60.     hour = hour + GMToffset
  61.     IF (hour > 23) THEN
  62.     DO
  63.         numDays = numDays + 1
  64.         hour = hour - 24
  65.     END
  66.     /*
  67.     **    Add on percentage of day
  68.     */
  69.     numDays = numDays + ((hour + (min / 60) + (sec / 3600)) / 24)
  70.     phase = PotM(numDays)
  71.     cp = 'The moon is'
  72.     IF (phase < 3.125) THEN cp = cp 'new'
  73.     ELSE IF (phase >= 96.875) THEN cp = cp 'full'
  74.     ELSE IF (phase >= 46.875) & (phase < 53.125) THEN
  75.     DO
  76.         phase2 = PotM(numDays + 1)
  77.         IF (phase2 > phase) THEN cp = cp 'at the first quarter'
  78.         ELSE cp = cp 'at the last quarter'
  79.     END
  80.     ELSE IF (phase >= 53.125) THEN
  81.     DO
  82.         phase2 = PotM(numDays + 1)
  83.         IF (phase2 > phase) THEN cp = cp 'waxing'
  84.         ELSE cp = cp 'waning'
  85.         cp = cp 'gibbous (' || TRUNC(phase) || '% full)'
  86.     END
  87.     ELSE
  88.     DO
  89.         phase2 = PotM(numDays + 1)
  90.         IF (phase2 > phase) THEN cp = cp 'waxing'
  91.         ELSE cp = cp 'waning'
  92.         cp = cp 'crescent (' || TRUNC(phase) || '% full)'
  93.     END
  94.     RETURN cp
  95.  
  96. /*
  97. **    Calc phase-of-the-moon; returns percentage of full
  98. */
  99. PotM: PROCEDURE
  100.     ARG numDays
  101.     EPSILONg = 279.611371    /* Solar ecliptic long at EPOCH */
  102.     RHOg = 282.680403            /* Solar ecliptic long of perigee at EPOCH */
  103.     e = 0.01671542                /* Solar orbit eccentricity */
  104.     Lzero = 18.251907            /* Lunar mean long at EPOCH */
  105.     Pzero = 192.917585        /* Lunar mean long of perigee at EPOCH */
  106.     Nzero = 55.204723            /* Lunar mean long of node at EPOCH */
  107.     PI = 3.1415926535897932384626433
  108.     N = 360 * numDays / 365.24219878    /* Days*360/Real_Days_of_a_Year */
  109.     N = Pos360(N)                /* Round up to positive 360 degrees */
  110.     Msol = N + EPSILONg - RHOg
  111.     Msol = Pos360(Msol)
  112.     Ec = 360 / PI * e * SIN(Deg2Rad(Msol))
  113.     LambdaSol = N + Ec + EPSILONg
  114.     LambdaSol = Pos360(LambdaSol)
  115.     l = 13.1763966 * numDays + Lzero
  116.     l = Pos360(l)
  117.     Mm = l - (0.1114041 * numDays) - Pzero
  118.     Mm = Pos360(Mm)
  119.     Nm = Nzero - (0.0529539 * numDays)
  120.     Nm = Pos360(Nm)
  121.     Ev = 1.2739 * SIN(Deg2Rad(2 * (l - LambdaSol) - Mm))
  122.     Ac = 0.1858 * SIN(Deg2Rad(Msol))
  123.     A3 = 0.37 * SIN(Deg2Rad(Msol))
  124.     Mmprime = Mm + Ev - Ac - A3
  125.     Ec = 6.2886 * SIN(Deg2Rad(Mmprime))
  126.     A4 = 0.214 * SIN(Deg2Rad(2 * Mmprime))
  127.     lprime = l + Ev + Ec - Ac + A4
  128.     V = 0.6583 * SIN(Deg2Rad(2 * (lprime - LambdaSol)))
  129.     ldprime = lprime + V
  130.     D = ldprime - LambdaSol
  131.     perc = 50 * (1 - COS(Deg2Rad(D)))
  132.     RETURN TRUNC(perc+0.005,2)    /* Return percent rounded to two decimals */
  133.  
  134. /*
  135. **    Get a positive 360 degree mod
  136. */
  137. Pos360: ARG deg
  138.     deg = deg // 360
  139.     IF (deg < 0) THEN deg = deg + 360
  140.     RETURN deg
  141.  
  142. /*
  143. **    Convert degrees to radians
  144. */
  145. Deg2Rad: PROCEDURE
  146.     ARG deg
  147.     PI = 3.1415926535897932384626433
  148.     RETURN (deg * PI) / 180
  149.  
  150. /*
  151. **    EOF
  152. */
  153.